Skip to content

S01-04 JavaSE-基础-运算符

[TOC]

第4章 运算符

运算符介绍

运算符介绍

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

Java中的运算符分类:

  1. 算术运算符
  2. 赋值运算符
  3. 关系运算符[比较运算符]
  4. 逻辑运算符
  5. 位运算符[需要二进制基础]
  6. 三元运算符

算术运算符

介绍

算术运算符是对数值类型的变量进行运算的,在Java程序中使用非常多。

算术运算符一览

运算符运算范例结果
+正号+7070
-负号b=11; -b-11
+加法9+918
-减法10-82
*乘法7*856
/除法9/91;9/6=1(整数除);10.0/4=2.5(小数除)
%取模(取余)11%92
++自增(前):先运算后取值;自增(后):先取值后运算a=2;b=++a;a=2;b=a++a=3;b=3;a=3;b=2
--自减(前):先运算后取值;自减(后):先取值后运算a=2;b=--a;a=2;b=a--a=1;b=1;a=1;b=2
+字符串相加"hsp"+"edu""hspedu"

案例演示

java
/**
 * 演示算术运算符的使用
 */
public class ArithmeticOperator {
    public static void main(String[] args) {
        // /使用
        System.out.println(10 / 4); // 2(整数除,保留整数部分)
        System.out.println(10.0 / 4); // 2.5(小数除)
        double d = 10 / 4; // java中10/4=2,2=>2.0
        System.out.println(d); // 2.0

        // % 取模,取余(本质:a % b = a - a / b * b)
        System.out.println(10 % 3); // 1(10 - 10/3*3=10-9=1)
        System.out.println(-10 % 3); // -1(-10 - (-10)/3*3=-10+9=-1)
        System.out.println(10 % -3); // 1(10 - 10/(-3)*(-3)=10-9=1)
        System.out.println(-10 % -3); // -1(-10 - (-10)/(-3)*(-3)=-10+9=-1)

        // ++的使用
        int i = 10;
        i++;// 自增等价于i = i + 1; => i=11
        ++i;// 自增等价于i = i + 1; => i=12
        System.out.println("i=" + i); // 12

        // 作为表达式使用:前++先自增后赋值,后++先赋值后自增
        int j = 8;
        // int k = ++j; // 等价j=j+1;k=j; => j=9,k=9
        int k = j++; // 等价k=j;j=j+1; => k=8,j=9
        System.out.println("k=" + k + " j=" + j); // 8 9
    }
}

细节说明

  1. 对于除号"/",整数除和小数除有区别:整数之间做除法时,只保留整数部分而舍弃小数部分(如int x=10/3,结果是3)
  2. 当对一个数取模时,等价于a%b=a-a/b*b,可通过该公式理解取模本质
  3. 当自增作为独立语句使用时,++i和i++效果一致,均等价于i=i+1
  4. 当自增作为表达式使用时,j=++i等价于先i自增,再将i的值赋给j;j=i++等价于先将i的值赋给j,再i自增
  5. 自减运算符用法与自增一致

面试题

  1. 面试题1:
java
int i=1;
i=i++;// 规则:(1)temp=i;(2)i=i+1;(3)i=temp;
System.out.println(i); // 结果:1
  1. 面试题2:
java
int i=1;
i=++i;// 规则:(1)i=i+1;(2)temp=i;(3)i=temp;
System.out.println(i); // 结果:2

自增,自减课堂练习

java
public class ArithmeticOperatorExercise01 {
    public static void main(String[] args) {
        int i1 = 10;
        int i2 = 20;
        int i = i1++;
        System.out.print("i=" + i); // 10
        System.out.println(" i2=" + i2); // 20
        i = --i2;
        System.out.print("i=" + i); // 19
        System.out.println(" i2=" + i2); // 19
    }
}

课堂练习2

java
/**
 * 课堂练习
 */
public class ArithmeticOperatorExercise02 {
    public static void main(String[] args) {
        // 1. 假如还有59天放假,问:合xx个星期零xx天
        int days = 25911;
        int weeks = days / 7;
        int leftDays = days % 7;
        System.out.println(days + "天合" + weeks + "星期零" + leftDays + "天");

        // 2. 华氏温度转换摄氏温度(公式:5/9*(华氏温度-100)),华氏温度为234.5
        double huaShi = 1234.6;
        double sheShi = 5.0 / 9 * (huaShi - 100);
        System.out.println("华氏温度" + huaShi + "对应的摄氏温度=" + sheShi);
    }
}

关系运算符(比较运算符)

介绍

  1. 关系运算符的结果都是boolean型,要么是true,要么是false
  2. 关系表达式经常用在if结构的条件中或循环结构的条件中

关系运算符一览

运算符说明范例结果
==等于8==7false
!=不等于8!=7true
>大于8>7true
>=大于等于8>=7true
<小于8<7false
<=小于等于8<=7false

案例演示

java
/**
 * 演示关系运算符的使用
 */
public class RelationalOperator {
    public static void main(String[] args) {
        int a = 9;
        int b = 8;
        System.out.println(a > b); // T
        System.out.println(a >= b); // T
        System.out.println(a <= b); // F
        System.out.println(a < b); // F
        System.out.println(a == b); // F
        System.out.println(a != b); // T
        boolean flag = a > b; // T
        System.out.println("flag=" + flag);
    }
}

细节说明

  1. 关系运算符的结果都是boolean型,要么是true,要么是false
  2. 关系运算符组成的表达式称为关系表达式(如a>b)
  3. 比较运算符"=="不能误写成"="(赋值运算符)

逻辑运算符

介绍

用于连接多个条件(多个关系表达式),最终的结果也是一个boolean值。

逻辑运算符一览

| a | b | a&b(逻辑与) | a&&b(短路与) | a|b(逻辑或) | a||b(短路或) | !a(取反) | a^b(逻辑异或) | | --- | --- | --- | --- | --- | --- | --- | --- | | true | true | true | true | true | true | false | false | | true | false | false | false | true | true | false | true | | false | true | false | false | true | true | true | true | | false | false | false | false | false | false | true | false |

逻辑运算规则:

  1. a&b(逻辑与):a和b同时为true,结果为true,否则为false
  2. a&&b(短路与):a和b同时为true,结果为true,否则为false
  3. a|b(逻辑或):a和b有一个为true,结果为true,否则为false
  4. a||b(短路或):a和b有一个为true,结果为true,否则为false
  5. !a(取反):a为true,结果为false;a为false,结果为true
  6. a^b(逻辑异或):a和b不同时,结果为true,否则为false

&& 和& 基本规则

名称语法特点
短路与&&条件1 && 条件2两个条件都为true,结果为true,否则false
逻辑与&条件1 & 条件2两个条件都为true,结果为true,否则false

&& 和& 案例演示

java
/**
 * 演示逻辑运算符的使用
 */
public class LogicOperator01 {
    public static void main(String[] args) {
        // &&短路与 和& 案例演示
        int age = 50;
        if (age > 20 && age < 90) {
            System.out.println("ok100");
        }

        // &逻辑与使用
        if (age > 20 & age < 90) {
            System.out.println("ok200");
        }

        // 区别:短路与第一个条件为false时,第二个条件不判断;逻辑与仍判断
        int a = 4;
        int b = 9;
        if (a < 1 & ++b < 50) {
            System.out.println("ok300");
        }
        System.out.println("a=" + a + " b=" + b); // 4 10(b自增了,说明第二个条件被判断)
    }
}

&& 和& 使用区别

  1. 短路与&&:如果第一个条件为false,第二个条件不再判断,最终结果为false,效率高
  2. 逻辑与&:不管第一个条件是否为false,第二个条件都要判断,效率低
  3. 开发中,基本使用短路与&&

|| 和| 基本规则

名称语法特点
短路或
逻辑或条件1

|| 和| 案例演示

java
/**
 * 演示|| 和| 使用
 */
public class LogicOperator02 {
    public static void main(String[] args) {
        // ||短路或 和|逻辑或案例演示
        int age = 50;
        if (age > 20 || age < 30) {
            System.out.println("ok100");
        }

        // |逻辑或使用
        if (age > 20 | age < 30) {
            System.out.println("ok200");
        }

        // 区别:短路或第一个条件为true时,第二个条件不判断;逻辑或仍判断
        int a = 4;
        int b = 9;
        if (a > 1 || ++b > 4) { // 换成|,b会自增
            System.out.println("ok300");
        }
        System.out.println("a=" + a + " b=" + b); // 4 9(b未自增,说明第二个条件未判断)
    }
}

|| 和| 使用区别

  1. 短路或||:如果第一个条件为true,第二个条件不再判断,最终结果为true,效率高
  2. 逻辑或|:不管第一个条件是否为true,第二个条件都要判断,效率低
  3. 开发中,基本使用短路或||

! 取反基本规则

名称语法特点
! 非(取反)!条件如果条件本身成立,结果为false,否则为true

! 案例演示

java
/**
 * !和^案例演示
 */
public class InverseOperator {
    public static void main(String[] args) {
        // ! 操作是取反T->F,F->T
        System.out.println(60 > 20); // T
        System.out.println(!(60 > 20)); // F

        // a^b:逻辑异或,a和b不同时,结果为true,否则为false
        boolean b = (10 > 1) ^ (3 > 5);
        System.out.println("b=" + b);//T
}
}

^ 案例演示

a^b:叫逻辑异或,当a和b不同时,则结果为true,否则为false

java
System.out.println((4 < 1) ^ (6 > 3)); // ?

练习题1 请写出每题的输出结果

java
//第一题
int x=5,y=5;
if(x++==6&++y==6){
x=11;
}
System.out.println("x="+x+",y="+y); //6,6

//第二题
int x=5,y=5;
if(x++==6&&++y==6){
x=11;
}
System.out.println("x="+x+",y="+y); //6,5

//第三题
int x=5,y=5;
if(x++==5|++y==5){
x=11;
}
System.out.println("x="+x+",y="+y); //11,6

//第四题
int x=5,y=5;
if(x++==5||++y==5){
x=11;
}
System.out.println("x="+x+",y="+y); //11,5

练习题2 请写输出结果

java
boolean x=true;
boolean y=false;
short z=46;
if((z++==46)&&(y=true))z++;
if(x=false)||(++z==49))z++;
System.out.println("z="+z);//50

赋值运算符

介绍

赋值运算符就是将某个运算后的值,赋给指定的变量。

赋值运算符的分类

  • 基本赋值运算符:= ,例:int a=10;
  • 复合赋值运算符:+= , -= , *= , /= , %= 等,重点讲解+=,其它使用同理
    • a += b ; 等价 a = a + b;
    • a -= b ; 等价 a = a - b;

案例演示

  1. 赋值基本案例:int num1 = 10
  2. += 的使用案例

(AssignOperator.java)

java
//演示赋值运算符的使用
public class AssignOperator {
//编写一个main 方法
public static void main(String[] args) {
int n1 = 10;
n1 += 4;// n1 = n1 + 4;
System.out.println(n1); // 14
n1 /= 3;// n1 = n1 / 3;//4
System.out.println(n1); // 4
//复合赋值运算符会进行类型转换
byte b = 3;
b += 2; // 等价b = (byte)(b + 2);
b++; // b = (byte)(b+1);
}
}

赋值运算符特点

  1. 运算顺序从右往左:int num = a + b + c;
  2. 赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值:
    • int num =20;
    • int num2= 78 * 34 - 10;
    • int num3 = a;
  3. 复合赋值运算符等价于下面的效果:比如 a += 3; 等价于 a = a + 3,其他类推
  4. 复合赋值运算符会进行类型转换:byte b=2 ; b+=3 ; b++;

三元运算符

基本语法

条件表达式? 表达式1: 表达式2;

运算规则:

  1. 如果条件表达式为true,运算后的结果是表达式1;
  2. 如果条件表达式为false,运算后的结果是表达式2; 口诀:[一灯大师:一真大师]

案例演示

(TernaryOperator.java)

java
//三元运算符使用
public class TernaryOperator {
public static void main(String[] args) {
int a = 10;
int b = 99;
// 1. a > b 为false
// 2. 返回b--, 先返回b的值,然后b-1
// 3. 结果为99
int result = a > b ? a++ : b--;
System.out.println("result=" + result);
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}

使用细节

(TernaryOperatorDetail.java)

  1. 表达式1 和表达式2 要为可以赋给接收变量的类型(或可以自动转换)
  2. 三元运算符可以转成if--else 语句:int res = a > b ? a++ : --b; 等价于 if (a > b) res = a++; else res = --b;
java
//三元运算符细节
public class TernaryOperatorDetail {
public static void main(String[] args) {
//表达式1 和表达式2 要为可以赋给接收变量的类型
//(或可以自动转换/或者强制转换)
int a = 3;
int b = 8;
int c = a > b ? (int)1.1 : (int)3.4;//可以的
double d = a > b ? a : b + 3;//可以的,满足int -> double
}
}

课堂练习

案例:实现三个数的最大值 (TernaryOperatorExercise.java)

java
public class TernaryOperatorExercise {
//编写一个main 方法
public static void main(String[] args) {
//案例:实现三个数的最大值
int n1 = 553;
int n2 = 33;
int n3 = 123;
//思路
//1. 先得到n1 和n2 中最大数, 保存到max1
int max1 = n1 > n2 ? n1 : n2;
//2. 然后再求出max1 和n3 中的最大数,保存到max2
int max2 = max1 > n3 ? max1 : n3;
System.out.println("最大数=" + max2);
//使用一条语句实现, 推荐使用上面方法
//老师提示: 后面我们可以使用更好方法,比如排序
int max = (n1 > n2 ? n1 : n2) > n3 ? (n1 > n2 ? n1 : n2) : n3;
System.out.println("最大数=" + max);

int n = 40;
int N = 50;
System.out.println("n=" + n);//40
System.out.println("N=" + N);//50
//注意:abc 和aBc 是两个不同变量
int abc = 100;
int aBc = 200;
//int a b = 300;//错误
//int a-b=10;//错误
int goto1 = 10;
}
}

运算符优先级

  1. 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如上表,上一行运算符总优先于下一行。
  2. 只有单目运算符、赋值运算符是从右向左运算的。
  3. 一览表,不要背,使用多了就熟悉了。
运算符结合性
!(data type)R->L
位移(<<, >>, >>>)L->R
*, /, %L->R
+, -L->R
<, <=, >, >=, instanceofL->R
==, !=L->R
&L->R
^L->R
&&L->R
?:R->L
=, +=, -=, *=, /=, %=, &=, ^=,=, <<=, >>=, >>>=

标识符的命名规则和规范

标识符概念

  1. Java对各种变量、方法和类等命名时使用的字符序列称为标识符
  2. 凡是自己可以起名字的地方都叫标识符,例:int num1=90;

标识符的命名规则(必须遵守)

  1. 由26个英文字母大小写、0-9、或$组成
  2. 数字不可以开头,例:int 3ab=1;//错误
  3. 不可以使用关键字和保留字,但能包含关键字和保留字
  4. Java中严格区分大小写,长度无限制,例:int totalNum=10; int n=90;
  5. 标识符不能包含空格,例:int a b=90;//错误

判断下面变量名是否正确

变量名是否正确原因
hspok-
hsp12ok-
1hsp错误数字不能开头
h-s错误不能有减号
x h错误有空格
h$4ok-
class错误class是关键字
hS4ok-
int错误int是关键字
double错误double是关键字
public错误public是关键字
static错误static是关键字
goto错误goto是保留字
stu_nameok-

标识符命名规范[更加专业]

  1. 包名:多单词组成时所有字母都小写:aaa.bbb.ccc,比如com.hsp.crm
  2. 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz[大驼峰],比如TankShotGame
  3. 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz[小驼峰,简称驼峰法],比如tankShotGame
  4. 常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ,比如定义一个所得税率TAX_RATE
  5. 后面我们学习到类、包、接口等时,我们的命名规范要这样遵守,更加详细的看文档。

关键字

关键字的定义和特点(不用背)

  • 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
  • 特点:关键字中所有字母都为小写

关键字分类

分类关键字
用于定义数据类型的关键字class, interface, enum, byte, short, int, long, float, double, char, boolean, void
用于定义数据类型值的关键字true, false, null
用于定义流程控制的关键字if, else, switch, case, default, while, do, for, break, continue, return
用于定义访问权限修饰符的关键字private, protected, public
用于定义类、函数、变量修饰符的关键字abstract, final, static, synchronized
用于定义类与类之间关系的关键字extends, implements
用于定义建立实例及引用实例、判断实例的关键字new, this, super, instanceof
用于异常处理的关键字try, catch, finally, throw, throws
用于包的关键字package, import
其他修饰符关键字native, strictfp, transient, volatile, assert

保留字

介绍

Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字:byValuecastfuturegenericinneroperatorouterrestvargotoconst

键盘输入语句

介绍

在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。(Input.java),需要一个扫描器(对象),就是Scanner

步骤

  1. 导入该类的所在包:java.util.*
  2. 创建该类对象(声明变量)
  3. 调用里面的功能

案例演示

要求:可以从控制台接收用户信息,【姓名,年龄,薪水】

java
import java.util.Scanner;//表示把java.util下的Scanner类导入
public class Input {
//编写一个main 方法
public static void main(String[] args) {
//演示接受用户的输入
//Scanner类表示简单文本扫描器,在java.util包中
//1. 创建Scanner对象
Scanner myScanner = new Scanner(System.in);
//2. 接收用户输入
System.out.println("请输入名字");
String name = myScanner.next(); //接收用户输入字符串
System.out.println("请输入年龄");
int age = myScanner.nextInt(); //接收用户输入int
System.out.println("请输入薪水");
double sal = myScanner.nextDouble(); //接收用户输入double
//3. 输出用户信息
System.out.println("人的信息如下:");
System.out.println("名字=" + name + " 年龄=" + age + " 薪水=" + sal);
}
}

进制(程序员的基本功)

进制介绍

对于整数,有四种表示方式:

  1. 二进制:0,1,满2进1,以0b或0B开头。
  2. 十进制:0-9,满10进1。
  3. 八进制:0-7,满8进1,以数字0开头表示。
  4. 十六进制:0-9及A(10)-F(15),满16进1,以0x或0X开头表示,此处的A-F不区分大小写。

举例说明

(BinaryTest.java)

java
//演示四种进制
public class BinaryTest {
//编写一个main 方法
public static void main(String[] args) {
//n1 二进制
int n1 = 0b1010;
//n2 十进制
int n2 = 1010;
//n3 八进制
int n3 = 01010;
//n4 十六进制
int n4 = 0X10101;
System.out.println("n1=" + n1);
System.out.println("n2=" + n2);
System.out.println("n3=" + n3);
System.out.println("n4=" + n4);
System.out.println(0x23A);
}
}

进制的图示

十进制十六进制八进制二进制
0000
1111
22210
33311
444100
555101
666110
777111
88101000
99111001
10A121010
11B131011
12C141100
13D151101
14E161110
15F171111
16102010000
17112110001

进制的转换(基本功)

进制转换的介绍

  • 第一组:
    1. 二进制转十进制
    2. 八进制转十进制
    3. 十六进制转十进制
  • 第二组:
    1. 十进制转二进制
    2. 十进制转八进制
    3. 十进制转十六进制
  • 第三组:
    1. 二进制转八进制
    2. 二进制转十六进制
  • 第四组:
    1. 八进制转二进制
    2. 十六进制转二进制

二进制转换成十进制示例

规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。 案例:请将0b1011转成十进制的数

0b1011 = 1*2^(1-1) + 1*2^(2-1) + 0*2^(3-1) + 1*2^(4-1) = 1 + 2 + 0 + 8 = 11

八进制转换成十进制示例

规则:从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。 案例:请将0234转成十进制的数

0234 = 4*8^0 + 3*8^1 + 2*8^2 = 4 + 24 + 128 = 156

十六进制转换成十进制示例

规则:从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。 案例:请将0x23A转成十进制的数

0x23A = 10*16^0 + 3*16^1 + 2*16^2 = 10 + 48 + 512 = 570

课堂练习

请将以下进制转成十进制:

  1. 0b110001100
  2. 02456
  3. 0xA45

十进制转换成二进制

规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。 案例:请将34转成二进制 = 0B00100010

十进制转换成八进制

规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。 案例:请将131转成八进制 => 0203

十进制转换成十六进制

规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。 案例:请将237转成十六进制 => 0xED

课堂练习

  1. 123转成二进制 => ?
  2. 678转成八进制 => ?
  3. 8912转成十六进制 => ?

二进制转换成八进制

规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。 案例:请将0b11010101转成八进制

0b11(3) 010(2) 101(5) => 0325

二进制转换成十六进制

规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。 案例:请将0b11010101转成十六进制

0b1101(D) 0101(5) = 0xD5

课堂练习

  1. 0b11100101转成八进制
  2. 0b1110010110转成十六进制

八进制转换成二进制

规则:将八进制数每1位,转成对应的一个3位的二进制数即可。 案例:请将0237转成二进制

02(010) 3(011) 7(111) = 0b10011111

十六进制转换成二进制

规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。 案例:请将0x23B转成二进制

0x2(0010) 3(0011) B(1011) = 0b001000111011

课堂练习

  1. 01230转成二进制
  2. 0xAB29转成二进制

位运算的思考题

  1. 请看下面的代码段,回答a,b,c,d,e结果是多少?
java
public static void main(String[] args) {
int a=1>>2; // 1 向右位移2位
int b=-1>>2;//算术右移
int c=1<<2;//算术左移
int d=-1<<2;
int e=3>>>2;//无符号右移
//a,b,c,d,e 结果是多少
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("d="+d);
System.out.println("e="+e);
}
  1. 请回答在java中,下面的表达式运算的结果是:(位操作)
~2=? // 按位取反
2&3=?// 2 按位与3
2|3=?
~-5=?
13&7=?
5|4=?
-3^3=?//^ 按位异或

二进制在运算中的说明

  1. 二进制是逢2进位的进位制,0、1是基本算符。
  2. 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。

原码、反码、补码(重点难点)

网上对原码,反码,补码的解释过于复杂,我这里精简几句话:(背下来) 对于有符号的而言:

  1. 二进制的最高位是符号位:0表示正数,1表示负数(老韩口诀:0->正,1->负)
  2. 正数的原码,反码,补码都一样(三码合一)
  3. 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
  4. 负数的补码=它的反码+1,负数的反码=负数的补码-1
  5. 0的反码,补码都是0
  6. java没有无符号数,换言之,java中的数都是有符号的
  7. 在计算机运算的时候,都是以补码的方式来运算的
  8. 当我们看运算结果的时候,要看他的原码(重点)

位运算符

java中有7个位运算(&、|、^、~、>>、<<和>>>)

分别是按位与&、按位或|、按位异或^、按位取反~,它们的运算规则是:

  • 按位与&:两位全为1,结果为1,否则为0
  • 按位或|:两位有一个为1,结果为1,否则为0
  • 按位异或^:两位一个为0,一个为1,结果为1,否则为0
  • 按位取反~:0->1,1->0

比如:2&3=? ~-2=? ~2=? 2|3=? 2^3=? (BitOperator.java)

还有3个位运算符>>、<< 和>>>,运算规则:

  1. 算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
  2. 算术左移<<:符号位不变,低位补0
  3. 逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0

  4. 特别说明:没有<<<符号

应用案例

(BitOperator02.java)

  1. int a=1>>2 ; // 1=>00000001=>00000000 本质 1/2/2=0
  2. int c=1<<2 ; // 1=>00000001=>00000100 本质 122=4

本章作业

  1. 计算下列表达式的结果
10/3=3; 10/5=2; 10%2=0; -10.5%3=?;
//a%b当a是小数时,公式=a-(int)a/b*b
//-10.5%3=-10.5-(-10)/3*3=-10.5+9=-1.5
//注意:有小数运算,得到结果是近似值
  1. 试说出下面代码的结果
java
int i=66;
System.out.println(++i+i);//执行i=i+1=>i=67=>134
  1. 在Java中,以下赋值语句正确的是(CD)。 A) int num1=(int)"18";//错误应该Integer.parseInt("18"); B) int num2=18.0;//错误double ->int C) double num3=3d; //ok D) double num4=8; //ok int -> double E) int i=48; char ch=i+1;//错误int ->char F) byte b = 19; short s = b+2;//错误int ->short

  2. 试写出将String转换成double类型的语句,以及将char类型转换成String的语句,举例说明即可,写简单代码

java
String str ="18.8";//注意字符串要可以被转成double
double d1 = Double.parseDouble(str);
char c1='韩';
String str2 = String.valueOf(c1); // 或 String str2 = c1 + "";